package com.xm;

import java.util.ServiceLoader;
import java.util.function.Consumer;

/**
 * Author：xm
 * Project：interview
 * Date：2025/8/26  13:55
 */

public class SpiTest {
    public static void main(String[] args) {
        // SPI(Service Provider Interface) 是一种用于实现服务接口与具体实现解耦的机制。
        /*
         * Java SPI是 Java官方提供的服务发现机制，属于JDK标准的一部分，它允许通过接口定义服务，由第三方提供实现类，并通过配置文件动态加载实现。
         * 核心类 ServiceLoader，作用是加载实现类，可以加载一个接口的所有实现类。
         * ServiceLoader会遍历所有 jar包 resources中 META-INF/services/下的文件，文件名为接口的全限定类名，内容为实现类的全限定名。
         * ServiceLoader通过反射进行加载，所有的接口实现类必须拥有一个无参构造函数，否则实现类无法被反射实例化。
         */
        ServiceLoader<IPayService> services = ServiceLoader.load(IPayService.class);
        // lambda表达式(匿名函数),把函数作为参数传递进方法中
        services.forEach(service -> service.pay());
        System.out.println("===");

        // 方法引用（方法引用是 lambda表达式的简写）
        services.forEach(IPayService::pay);
        System.out.println("===");

        // 增强 for循环
        for (IPayService service : services) {
            service.pay();
        }
        System.out.println("===");

        // 传入匿名内部类对象作为参数
        services.forEach(new Consumer<IPayService>() {
            @Override
            public void accept(IPayService service) {
                service.pay();
            }
        });
        System.out.println("===");

        // 常规对象调用
        ConsumerImpl consumer = new ConsumerImpl();
        consumer.accept(new AliPayService());

        // System.out.println("***");
        // new Consumer<IPayService>() {
        //     @Override
        //     public void accept(IPayService service) {
        //         service.pay();
        //     }
        // }.accept(new WxPayService());

        // ((Consumer<IPayService>) IPayService::pay).accept(new WxPayService());

        // ((Consumer<IPayService>) service -> service.pay()).accept(new WxPayService());
    }
}
